package com.yenroc.ho.多线程;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 多线程间的协调：wait().notify()
 */
public class MyThread03 {

    public static void main(String[] args) {
        QueueList<String> queueList = new QueueList<>();
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(()->{
                String s = queueList.get();
                System.out.print(Thread.currentThread().getName() + "\tget s="+s+" \n");
            });
            t.start();
        }
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(()->{
                queueList.add(Thread.currentThread().getName());
                System.out.print(Thread.currentThread().getName() + "\t add s="+Thread.currentThread().getName()+" \n");
            });
            t.start();
        }
    }

}

class QueueList<T> {

    private Queue<T> queue = new LinkedList();

    public synchronized void add(T t){
        queue.add(t);
        // 使用notifyAll()将唤醒所有当前正在this锁等待的线程，而notify()只会唤醒其中一个
        this.notifyAll();// 这个方法会唤醒一个正在this锁等待的线程
    }

    public synchronized T get() {
        while (queue.isEmpty()) {
            try {
                this.wait();//当一个线程在this.wait()等待时，它就会释放this锁，从而使得其他线程能够在add()方法获得this锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return queue.remove();
    }

}

